package com.example.gaoyang.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.gaoyang.domain.SysElement;
import com.example.gaoyang.domain.request.SysElementRequest;
import com.example.gaoyang.domain.vo.SysElementVO;
import com.example.gaoyang.request.Result;

import java.util.List;

public interface SysElementService extends IService<SysElement> {

    /**
     * 新增系统元素
     * @param sysElementRequest
     * @return
     */
    void addSysElement(SysElementRequest sysElementRequest);

    /**
     * 删除系统元素
     * @param sysElementRequest
     * @return
     */
    void removeSysElement(SysElementRequest sysElementRequest);

    /**
     * 获取系统元素列表
     * @param sysElementRequest
     * @return
     */
    List<SysElementVO> getSysElementList(SysElementRequest sysElementRequest);

    /**
     * 获取系统元素分页列表
     * @param page
     * @param sysElementRequest
     * @return
     */
    IPage<SysElementVO> getSysElementPage(IPage<SysElement> page, SysElementRequest sysElementRequest);

    /**
     * 更新系统元素
     * @param sysElementRequest
     * @return
     */
    void updateSysElement(SysElementRequest sysElementRequest);

    /**
     * 获取所有系统元素树形结构
     * @return
     */
    List<SysElementVO> getAllElementTree();

    /**
     * 获取所有链路父元素
     * 比如三级菜单获取的元素就有三个，它本身，他父级和他父级的父级
     * @param childId
     * @return
     */
    List<SysElement> getLinkParentElementById(Long childId);

    /**
     * 获取多个子元素的所有父元素，并确保返回的父元素不重复。
     * @param childIds 子元素的ID列表
     * @return 包含所有父元素的列表
     */
    List<SysElement> getLinkParentElementByList(List<Long> childIds);

    /**
     * 获取所有链路子元素
     * @param parentId
     * @return
     */
    List<SysElement> getLinkChildElementById(Long parentId);

    /**
     * 获取多个父元素及其所有子元素，并确保返回的子元素不重复。
     * @param parentIds 父元素的ID列表
     * @return 包含所有父元素及其子元素的列表
     */
    List<SysElement> getLinkChildElementByList(List<Long> parentIds);

    /**
     * 构建元素树形结构
     * @param elements
     * @return
     */
    List<SysElementVO> buildElementTree(List<SysElementVO> elements);
}
